package com.lmy.springCloud.config;

import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 配置类-配置路由
 */
@Configuration
public class GatewayRoutesConfig {

    /**
     * 通过配置类注入路由，可以对照application.yaml
     *   cloud:
     *     gateway:
     *       #配置gateway路由,可以配置多个路由 List<RouteDefinition> routes
     *       #在yaml中配置对象数组,对象属性就是RouteDefinition中的属性
     *       routes:
     *         - id: member_route01  #路由id,保证唯一即可
     *           #gateway最终访问的url 是 uri + path
     *           #匹配后提供服务的路由地址:也可以是外网
     *           #比如:客户端/浏览器 请求url http://localhost:20000/getMemberById/1
     *           #如果根据Path匹配成功,那么最终访问的url/转发的url: http://localhost:9090/getMemberById/1
     *           #如果匹配失败,则由gateway返回404错误信息给到客户端/浏览器
     *           #这里配置的uri是固定的,在当前这种情况下,其实可以不使用EurekaServer,后续改进.
     *           uri: http://localhost:9090
     *           #断言,可以有多种形式的断言,这里使用路径断言
     *           predicates:
     *             - Path=/getMemberById/**
     *
     * 1. 下面的方法分别指定了id,uri,path
     * 2. Function<PredicateSpec, Route.AsyncBuilder> fn
     *    I)是一个函数式接口
     *    II)接收的类型是 PredicateSpec，返回的类型是  Route.AsyncBuilder
     *    III)r -> r.path("/getMemberById/**").uri("http://localhost:9090") 就是一个lambda表达式
     * @return
     */
    @Bean
    public RouteLocator myRouteLocator04(RouteLocatorBuilder builder) {
        RouteLocatorBuilder.Builder routes = builder.routes();
        RouteLocator memberRoute04 = routes.route("member_route04",
                r -> r.path("/b").uri("http://www.bilibili.com")).build();
        return memberRoute04;
    }
}
